#include "serialif.h"
#include <qDebug>

SerialIo::SerialIo(void)
{
	m_bdrate = 115200;
	m_port_name.clear();
	m_ser = NULL;
}

SerialIo::SerialIo(QString port, qint32 bdrate = 115200)
{
	m_bdrate = bdrate;
	m_port_name = port;
	m_ser = NULL;
}

void SerialIo::_write(QByteArray data)
{
	if (m_ser && m_ser->isOpen())
	{
		m_ser->write(data);
	}
}

SerialIo::~SerialIo(void)
{
	if (m_ser)
	{
		disconnect(m_ser, &QSerialPort::readyRead, this, &SerialIo::on_data_read);
		m_ser->close();
		delete m_ser;
		m_ser = NULL;
	}
}

void SerialIo::setPortName(QString port)
{
	m_port_name = port;
}
QString SerialIo::getPortName(void)
{
	return m_port_name;
}

bool SerialIo::_open(void)
{
	m_ser = new QSerialPort();
	m_ser->setPortName(m_port_name);
	if (!m_ser->setBaudRate(m_bdrate))
	{
		return false;
	}
	if (!m_ser->open(QIODevice::ReadWrite))
	{
		return false;
	}
	m_ser->setDataBits(QSerialPort::Data8);
	m_ser->setParity(QSerialPort::NoParity);
	m_ser->setStopBits(QSerialPort::OneStop);
	m_ser->setFlowControl(QSerialPort::NoFlowControl);
	connect(m_ser, &QSerialPort::readyRead, this, &SerialIo::on_data_read);
	return true;
}

void SerialIo::_close(void)
{
	if (m_ser)
	{
		disconnect(m_ser, &QSerialPort::readyRead, this, &SerialIo::on_data_read);
		m_ser->close();
		delete m_ser;
		m_ser = NULL;
	}
}

void SerialIo::on_data_read(void)
{
	while (m_ser->bytesAvailable())
	{
		emit DataReady(m_ser->readAll());
	}
}